import java.util.*;


public class permuteUnique {
    /**
     * 给出一组可能包含重复项的数字，返回该组数字的所有排列。结果以字典序升序排列。
     * 输入：[1,1,2]
       返回值：[[1,1,2],[1,2,1],[2,1,1]]
     * 
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     * 
     * @param num int整型一维数组 
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> permuteUnique (int[] num) {
        if (num.length == 0) {
            return new ArrayList<>();
        }
        StringBuffer numStr = new StringBuffer();
        for (int i = 0; i < num.length; ++i) {
            numStr.append(num[i]);
        }
        Set<String> result = new HashSet<>();
        dfs("", numStr.toString(), result);
        ArrayList<String> numArray = new ArrayList<>(result);

        //转化成返回类型
        ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
        for (String str : numArray) {
            ArrayList<Integer> list = new ArrayList<>();
            for (int i = 0; i < str.length(); ++i) {
                list.add(Integer.parseInt(str.charAt(i) + ""));
            }
            ans.add(list);
        }
        return ans;
    }

    void dfs(String prefix, String remain, Set<String> result) {
        if (remain.length() == 0) {
            result.add(prefix);
            return;
        }
        for (int i = 0; i < remain.length(); ++i) {
            String newPrefix = prefix + remain.charAt(i);
            String newRemain = remain.substring(0, i) + remain.substring(i + 1);
            dfs(newPrefix, newRemain, result);
        }
    }
}